"""
插件系统使用示例
演示如何使用插件管理器加载和使用插件
"""

import sys
import os
import logging

# 添加核心模块路径
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'core'))

from plugin_manager import PluginManager
from api_context import APIContext
from hook_hub import HookHub


# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)


def main() -> None:
    """主函数"""
    print("=" * 60)
    print("插件系统使用示例")
    print("=" * 60)
    print()
    
    # 1. 创建API上下文
    print("[1] 创建API上下文")
    api_context = APIContext("MyApp")
    api_context.set_config('app_name', 'Plugin Demo')
    api_context.set_config('version', '1.0.0')
    print("    ✅ API上下文创建完成")
    print()
    
    # 2. 创建钩子中心
    print("[2] 创建钩子中心")
    hook_hub = HookHub()
    
    # 注册全局钩子
    def on_plugin_loaded(plugin_name: str) -> None:
        print(f"    🎉 钩子触发: 插件 {plugin_name} 已加载")
    
    def on_plugin_unloaded(plugin_name: str) -> None:
        print(f"    👋 钩子触发: 插件 {plugin_name} 已卸载")
    
    hook_hub.register('plugin_loaded', on_plugin_loaded)
    hook_hub.register('plugin_unloaded', on_plugin_unloaded)
    print("    ✅ 钩子注册完成")
    print()
    
    # 3. 创建插件管理器
    print("[3] 创建插件管理器")
    plugin_dir = os.path.join(os.path.dirname(__file__), 'plugins')
    manager = PluginManager(plugin_dir, api_context, hook_hub)
    print(f"    插件目录: {plugin_dir}")
    print("    ✅ 插件管理器创建完成")
    print()
    
    # 4. 扫描插件
    print("[4] 扫描插件")
    discovered = manager.scan(auto_load=False)
    print(f"    发现 {len(discovered)} 个插件:")
    for plugin_name in discovered:
        config = manager.get_config(plugin_name)
        if config:
            print(f"      - {plugin_name} v{config.version}")
            print(f"        作者: {config.author}")
            print(f"        描述: {config.description}")
    print()
    
    # 5. 加载插件
    print("[5] 加载插件")
    if 'hello_plugin' in discovered:
        try:
            plugin = manager.load('hello_plugin')
            print(f"    ✅ 插件加载成功: {plugin.name}")
            print(f"       版本: {plugin.version}")
            print(f"       作者: {plugin.author}")
        except Exception as e:
            print(f"    ❌ 插件加载失败: {e}")
    print()
    
    # 6. 使用插件
    print("[6] 使用插件")
    plugin = manager.get('hello_plugin')
    if plugin:
        # 调用插件功能
        result1 = plugin.run(name="张三")
        print(f"    调用结果: {result1}")
        
        result2 = plugin.run(name="李四")
        print(f"    调用结果: {result2}")
        
        result3 = plugin.run(name="王五")
        print(f"    调用结果: {result3}")
        
        # 获取调用统计
        print(f"    总调用次数: {plugin.get_call_count()}")
    print()
    
    # 7. 通过服务访问插件
    print("[7] 通过服务访问插件")
    hello_service = api_context.get_service('hello_service')
    if hello_service:
        result = hello_service.run(name="服务调用")
        print(f"    服务调用结果: {result}")
    print()
    
    # 8. 查看已加载插件
    print("[8] 查看已加载插件")
    loaded_plugins = manager.get_loaded_names()
    print(f"    已加载插件数量: {len(loaded_plugins)}")
    for name in loaded_plugins:
        p = manager.get(name)
        if p:
            print(f"      - {name}: {p.description}")
    print()
    
    # 9. 卸载插件
    print("[9] 卸载插件")
    if manager.unload('hello_plugin'):
        print("    ✅ 插件卸载成功")
    else:
        print("    ❌ 插件卸载失败")
    print()
    
    # 10. 重新加载插件
    print("[10] 重新加载插件")
    try:
        plugin = manager.reload('hello_plugin')
        print(f"    ✅ 插件重新加载成功: {plugin.name}")
        
        # 再次调用
        result = plugin.run(name="重载后调用")
        print(f"    调用结果: {result}")
        print(f"    调用次数: {plugin.get_call_count()}")  # 应该是1（重新开始）
    except Exception as e:
        print(f"    ❌ 插件重新加载失败: {e}")
    print()
    
    # 11. 禁用和启用插件
    print("[11] 禁用和启用插件")
    manager.disable('hello_plugin')
    print("    插件已禁用")
    
    manager.enable('hello_plugin')
    print("    插件已启用")
    print()
    
    # 12. 清理
    print("[12] 清理")
    manager.unload('hello_plugin')
    print("    ✅ 所有插件已卸载")
    print()
    
    print("=" * 60)
    print("示例演示完成！")
    print("=" * 60)


if __name__ == "__main__":
    main()
